{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "F:\\Anaconda3\\lib\\importlib\\_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 216, got 192\n",
      "  return f(*args, **kwds)\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>pregnants</th>\n",
       "      <th>Plasma_glucose_concentration</th>\n",
       "      <th>blood_pressure</th>\n",
       "      <th>Triceps_skin_fold_thickness</th>\n",
       "      <th>serum_insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>Diabetes_pedigree_function</th>\n",
       "      <th>Age</th>\n",
       "      <th>Target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>148</td>\n",
       "      <td>72</td>\n",
       "      <td>35</td>\n",
       "      <td>0</td>\n",
       "      <td>33.6</td>\n",
       "      <td>0.627</td>\n",
       "      <td>50</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>85</td>\n",
       "      <td>66</td>\n",
       "      <td>29</td>\n",
       "      <td>0</td>\n",
       "      <td>26.6</td>\n",
       "      <td>0.351</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>183</td>\n",
       "      <td>64</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>23.3</td>\n",
       "      <td>0.672</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>89</td>\n",
       "      <td>66</td>\n",
       "      <td>23</td>\n",
       "      <td>94</td>\n",
       "      <td>28.1</td>\n",
       "      <td>0.167</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>137</td>\n",
       "      <td>40</td>\n",
       "      <td>35</td>\n",
       "      <td>168</td>\n",
       "      <td>43.1</td>\n",
       "      <td>2.288</td>\n",
       "      <td>33</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   pregnants  Plasma_glucose_concentration  blood_pressure  \\\n",
       "0          6                           148              72   \n",
       "1          1                            85              66   \n",
       "2          8                           183              64   \n",
       "3          1                            89              66   \n",
       "4          0                           137              40   \n",
       "\n",
       "   Triceps_skin_fold_thickness  serum_insulin   BMI  \\\n",
       "0                           35              0  33.6   \n",
       "1                           29              0  26.6   \n",
       "2                            0              0  23.3   \n",
       "3                           23             94  28.1   \n",
       "4                           35            168  43.1   \n",
       "\n",
       "   Diabetes_pedigree_function  Age  Target  \n",
       "0                       0.627   50       1  \n",
       "1                       0.351   31       0  \n",
       "2                       0.672   32       1  \n",
       "3                       0.167   21       0  \n",
       "4                       2.288   33       1  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train = pd.read_csv('./pima-indians-diabetes.csv')\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train = train['Target']\n",
    "X_train = train.drop(['Target'], axis=1)\n",
    "feat_name = X_train.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "F:\\Anaconda3\\lib\\importlib\\_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 216, got 192\n",
      "  return f(*args, **kwds)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.model_selection import cross_val_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "logloss of each fold is:  [0.50473921 0.50786032 0.48226391]\n",
      "cv logloss is:  0.49828781375143655\n"
     ]
    }
   ],
   "source": [
    "#默认参数的Logistic回归\n",
    "lr=LogisticRegression()\n",
    "#交叉验证用于评估模型性能和进行参数调优（模型选择）\n",
    "#分类任务中交叉验证缺省是采用StratifiedKFold\n",
    "#数据集比较大，采用3折交叉验证\n",
    "loss=cross_val_score(lr, X_train, y_train, cv=3,scoring='neg_log_loss')\n",
    "#%timeit loss_sparse = cross_val_score(lr, X_train, y_train, cv=3, scoring='neg_log_loss')\n",
    "print('logloss of each fold is: ',-loss)\n",
    "print('cv logloss is: ', -loss.mean())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Logistic回归+GridSearchCV\n",
    "#需要调优的参数\n",
    "#请尝试将L1正则和L2正则分开，并配合合适的优化求解算法（solver）\n",
    "#tuned_parameters={'penalty':['l1','l2'],'C':[0.001,0.01,0.1,1,10,100,1000]}\n",
    "penaltys=['l1','l2']\n",
    "Cs=[0.001,0.01,0.1,1,10,100,1000]\n",
    "tuned_parameters=dict(penalty=penaltys,C=Cs)\n",
    "lr_penalty=LogisticRegression()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.48218892537813485\n",
      "{'C': 10, 'penalty': 'l2'}\n"
     ]
    }
   ],
   "source": [
    "#用log似然损失对Logistic回归模型的正则超参数调优\n",
    "grid1=GridSearchCV(lr_penalty,tuned_parameters,cv=5,scoring='neg_log_loss')\n",
    "grid1.fit(X_train,y_train)\n",
    "#examine the best model\n",
    "print(-grid1.best_score_)\n",
    "print(grid1.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "F:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:125: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "F:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:125: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#plot CV误差曲线\n",
    "test_means=grid1.cv_results_['mean_test_score']\n",
    "test_stds=grid1.cv_results_['std_test_score']\n",
    "train_means=grid1.cv_results_['mean_train_score']\n",
    "train_stds=grid1.cv_results_['std_train_score']\n",
    "#plot results\n",
    "n_Cs=len(Cs)\n",
    "number_penaltys=len(penaltys)\n",
    "test_scores=np.array(test_means).reshape(n_Cs,number_penaltys)\n",
    "train_scores=np.array(train_means).reshape(n_Cs,number_penaltys)\n",
    "test_stds=np.array(test_stds).reshape(n_Cs,number_penaltys)\n",
    "train_stds=np.array(train_stds).reshape(n_Cs,number_penaltys)\n",
    "x_axis=np.log10(Cs)\n",
    "for i,value in enumerate(penaltys):\n",
    "    #pyplot.plot(log(Cs),test_scores[i],label='penalty:',+str(value))\n",
    "    plt.errorbar(x_axis, -test_scores[:,i], yerr=test_stds[:,i], label=penaltys[i] +' Test')\n",
    "    #plt.errorbar(x_axis, -test_scores[:,i], yerr=train_stds[:,i], label=penaltys[i] +' Train')\n",
    "    \n",
    "plt.legend()\n",
    "plt.xlabel('log(C)')\n",
    "plt.ylabel('logloss')\n",
    "plt.savefig('LogisticGridSearchCV_C.png')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7721354166666666\n",
      "{'C': 100, 'penalty': 'l2'}\n"
     ]
    }
   ],
   "source": [
    "#用正确率对Logistic回归模型的正则超参数调优,scoring默认为正确率\n",
    "grid2=GridSearchCV(lr_penalty,tuned_parameters,cv=5)\n",
    "grid2.fit(X_train,y_train)\n",
    "#examine the best model\n",
    "print(grid2.best_score_)\n",
    "print(grid2.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "F:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:125: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "F:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:125: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#plot CV误差曲线\n",
    "test_means=grid2.cv_results_['mean_test_score']\n",
    "test_stds=grid2.cv_results_['std_test_score']\n",
    "train_means=grid2.cv_results_['mean_train_score']\n",
    "train_stds=grid2.cv_results_['std_train_score']\n",
    "#plot results\n",
    "n_Cs=len(Cs)\n",
    "number_penaltys=len(penaltys)\n",
    "test_scores=np.array(test_means).reshape(n_Cs,number_penaltys)\n",
    "train_scores=np.array(train_means).reshape(n_Cs,number_penaltys)\n",
    "test_stds=np.array(test_stds).reshape(n_Cs,number_penaltys)\n",
    "train_stds=np.array(train_stds).reshape(n_Cs,number_penaltys)\n",
    "x_axis=np.log10(Cs)\n",
    "for i,value in enumerate(penaltys):\n",
    "    #pyplot.plot(log(Cs),test_scores[i],label='penalty:',+str(value))\n",
    "    plt.errorbar(x_axis, -test_scores[:,i], yerr=test_stds[:,i], label=penaltys[i] +' Test')\n",
    "    #plt.errorbar(x_axis, -test_scores[:,i], yerr=train_stds[:,i], label=penaltys[i] +' Train')\n",
    "    \n",
    "plt.legend()\n",
    "plt.xlabel('log(C)')\n",
    "plt.ylabel('logloss')\n",
    "plt.savefig('LogisticGridSearchCV_C.png')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
